package br.com.foxinline.servico.historico;

import br.com.foxinline.generico.ServicoHistoricoGenerico;
import br.com.foxinline.modelo.Bairro;
import br.com.foxinline.servico.BairroServico;
import br.com.foxinline.servico.CidadeServico;
import br.com.foxinline.servico.UsuarioServico;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author laverson
 */
@Stateless
public class BairroHistoricoServico extends ServicoHistoricoGenerico<Bairro> {

    @EJB
    UsuarioServico usuarioServico;
    @EJB
    BairroServico bairroServico;
    @EJB
    CidadeServico cidadeServico;

    public BairroHistoricoServico() {
        super(Bairro.class);
    }

    public List<Bairro> history(Long id) {

        List<Object[]> history = findQueryHistory(id);

        Bairro atual = bairroServico.find(id);

        List<Bairro> historicos = new ArrayList<Bairro>();
        Bairro historico;

        for (Object[] object : history) {

            historico = novaEntidade(object);

            comparar(historico, atual, false);

            if (!historico.equals(atual) && isAdd()) {

                if (historico.getUsuarioAtualizacao() != null && historico.getUsuarioAtualizacao().getId() != null) {
                    historico.setUsuarioAtualizacao(usuarioServico.find(historico.getUsuarioAtualizacao().getId()));
                } else {
                    if (atual.getUsuarioAtualizacao() != null) {
                        historico.setUsuarioAtualizacao(usuarioServico.find(atual.getUsuarioAtualizacao().getId()));
                    }
                }

                historico.setDataAtualizacao((Date) object[12]);

                historicos.add(historico);

                setAdd(false);
            }

            atual = historico;
        }

        return historicos;
    }

    /**
     * Atribui os valores contidos em object[] para os atributos equivalentes a
     * entidade Bairro
     *
     * <br/> <p> <b>Author:</b> Diego Laverson</P>
     *
     * @param object
     * @return
     */
    private Bairro novaEntidade(Object[] object) {
        Bairro historico = new Bairro();

        historico.setId((Long) object[0]);
        historico.setNome((String) object[2]);
        historico.setUf((String) object[3]);

        if (object[4] != null) {
            historico.setCidade(cidadeServico.find((Long) object[4]));
//            bairroHistorico.setCidade(new Cidade());
//            bairroHistorico.getCidade().setId((Long) object[4]);
        }

        historico.setVersao((Integer) object[7]);

        if (object[8] != null) {
            historico.setUsuarioAtualizacao(usuarioServico.find((Long) object[8]));
//            bairroHistorico.setUsuarioAtualizacao(new Usuario());
//            bairroHistorico.getUsuarioAtualizacao().setId((Long) object[8]);
        }

        historico.setAtivo((Boolean) object[10]);

        return historico;
    }
}
